
package cn.org.rapid_framework.generator.provider.db.table.model.util;

import cn.org.rapid_framework.generator.provider.db.table.model.Column;
import cn.org.rapid_framework.generator.util.typemapping.DatabaseDataTypesUtils;

public class ColumnHelper {

    public static String[] removeHibernateValidatorSpecialTags(String str) {

	if (str==null||str.trim().length()==0)
	    return new String[] {};
	return str.trim().replaceAll("@", "").replaceAll("\\(.*?\\)", "").trim().split("\\s+");
    }

    /** 得到JSR303 bean validation的验证表达式 */
    public static String getHibernateValidatorExpression(Column c) {

	if (!c.isPk()&&!c.isNullable()) {
	    if (DatabaseDataTypesUtils.isString(c.getJavaType())) {
		return "@NotBlank "+getNotRequiredHibernateValidatorExpression(c);
	    } else {
		return "@NotNull "+getNotRequiredHibernateValidatorExpression(c);
	    }
	} else {
	    return getNotRequiredHibernateValidatorExpression(c);
	}
    }

    public static String getNotRequiredHibernateValidatorExpression(Column c) {

	String result = "";
	if (c.getSqlName().indexOf("mail")>=0) {
	    result += "@Email ";
	}
	if (DatabaseDataTypesUtils.isString(c.getJavaType())) {
	    result += String.format("@Length(max=%s)", c.getSize());
	}
	if (DatabaseDataTypesUtils.isIntegerNumber(c.getJavaType())) {
	    String javaType = DatabaseDataTypesUtils.getPreferredJavaType(c.getSqlType(),
		    c.getSize(), c.getDecimalDigits());
	    if (javaType.toLowerCase().indexOf("short")>=0) {
		result += " @Max("+Short.MAX_VALUE+")";
	    } else if (javaType.toLowerCase().indexOf("byte")>=0) {
		result += " @Max("+Byte.MAX_VALUE+")";
	    }
	}
	return result.trim();
    }

    /** 得到rapid validation的验证表达式 */
    public static String getRapidValidation(Column c) {

	String result = "";
	if (c.getSqlName().indexOf("mail")>=0) {
	    result += "validate-email ";
	}
	if (DatabaseDataTypesUtils.isFloatNumber(c.getJavaType())) {
	    result += "validate-number ";
	}
	if (DatabaseDataTypesUtils.isIntegerNumber(c.getJavaType())) {
	    result += "validate-integer ";
	    if (c.getJavaType().toLowerCase().indexOf("short")>=0) {
		result += "max-value-"+Short.MAX_VALUE;
	    } else if (c.getJavaType().toLowerCase().indexOf("integer")>=0) {
		result += "max-value-"+Integer.MAX_VALUE;
	    } else if (c.getJavaType().toLowerCase().indexOf("byte")>=0) {
		result += "max-value-"+Byte.MAX_VALUE;
	    }
	}
	return result;
    }
}
